package com.ts.api.http.org.biz;

import com.alibaba.fastjson.JSONObject;
import com.gitee.apanlh.util.base.ChooseEq;
import com.gitee.apanlh.util.base.Eq;
import com.gitee.apanlh.util.dataformat.JsonUtils;
import com.ts.api.http.org.entity.apply.OrgApplyHeBeiLeXiangRong;
import com.ts.api.http.org.entity.dataexchange.OrgDataExchangeHeBeiLeXiangRong;
import com.ts.api.module.api.convert.core.annotation.ApiPlan;
import com.ts.api.module.api.convert.core.annotation.ApiPlanConvertType;
import com.ts.api.module.api.convert.core.entity.ApiApplyParameter;
import com.ts.api.module.api.convert.core.entity.ApiDataExchangeParameter;
import com.ts.api.module.api.convert.core.utils.ApiFieldConverter;
import com.ts.api.module.api.convert.org.handler.ApiOrgPhoneMd5ConvertHandler;
import com.ts.api.module.api.convert.org.model.RespOrgPhoneMd5Apply;
import com.ts.api.module.api.convert.org.model.RespOrgPhoneMd5DataExchange;

/**
 *  安心分期-河北乐享融五选一25-测试
 *
 *  文档链接：https://docs.qq.com/doc/DVUhMam56dVJwRktO
 *
 *  @author 李源聪
 */
@ApiPlan(productId = "140", type = ApiPlanConvertType.ORG_PHONE_MD5)
public class ApiOrgPhoneMd5HeBeiLeXiangRong implements ApiOrgPhoneMd5ConvertHandler {

    @Override
    public Object dataExchange(ApiDataExchangeParameter apiDataExchangeParameter) throws Exception {
        // 撞库流程-默认JSON发送如果需要别的方式，或者需要增加请求头，请看apiDataChangeMessage实体拓展方法
        OrgDataExchangeHeBeiLeXiangRong orgDataExchange = new OrgDataExchangeHeBeiLeXiangRong();

        //  赋值撞库属性
        orgDataExchange.setPhoneMd5(apiDataExchangeParameter.getPhoneMd5());
        orgDataExchange.setCity(apiDataExchangeParameter.getCity());

        //  请求实体转换,默认JSON方式，如果FORM方式直接返回实体类，并且设置请求头为FORM表单
        String json = JsonUtils.toJson(orgDataExchange);
        return json;
    }

    @Override
    public RespOrgPhoneMd5DataExchange respDataExchange(String respJson) throws Exception {
        //  撞库返回响应体判断
        JSONObject jsonObject = JsonUtils.get(respJson);
        if (jsonObject == null) {
            return RespOrgPhoneMd5DataExchange.ofFail();
        }
        if (!Eq.object(jsonObject.getString("state"), "200")) {
            return RespOrgPhoneMd5DataExchange.ofFail();
        }
        //  根据文档响应判断
        return RespOrgPhoneMd5DataExchange.ofSuc();
    }

    @Override
    public Object apply(ApiApplyParameter apiApplyParameter) throws Exception {
        //  进件流程-默认JSON发送如果需要别的方式，或者需要增加请求头，请看apiApplyMessage拓展方法
        OrgApplyHeBeiLeXiangRong orgApply = new OrgApplyHeBeiLeXiangRong();

        //  赋值进件属性
        orgApply.setUserName(apiApplyParameter.getUserName());
        orgApply.setPhone(apiApplyParameter.getPhone());
        orgApply.setCity(apiApplyParameter.getCity());

        //  进件字段映射
        applyFieldMapping(apiApplyParameter, orgApply);

        //  请求实体转换,默认JSON方式，如果FORM方式直接返回实体类，并且设置请求头为FORM表单
        String json = JsonUtils.toJson(orgApply);
        return json;
    }

    @Override
    public RespOrgPhoneMd5Apply respApply(String respJson) throws Exception {
        //  进件返回响应体判断
        JSONObject jsonObject = JsonUtils.get(respJson);
        if (jsonObject == null) {
            return RespOrgPhoneMd5Apply.ofFail();
        }
        if (!Eq.object(jsonObject.getString("state"), "200")) {
            return RespOrgPhoneMd5Apply.ofFail();
        }
        //  根据文档响应判断
        return RespOrgPhoneMd5Apply.ofSuc();
    }

    /**
     *   字段转换映射
     *   1.表单信息字段转换(不需要的自行删除)
     *   2.第一个形参值是我方值, 第二个形参值,是对方文档值,必须注意参数类型对应, end指的是如果都不存在给默认值)
     */
    private void applyFieldMapping(ApiApplyParameter apiApplyParameter, OrgApplyHeBeiLeXiangRong orgApply) {
        //  获取封装字段转换器
        ApiFieldConverter apiFieldConverter = ApiFieldConverter.create(apiApplyParameter);

        //  获取年龄-自行根据文档中的类型
        Integer ageInt = apiFieldConverter.getAgeInt();
        String age = apiFieldConverter.getAge();

        //  城市/默认带市
        String sourceCity = apiApplyParameter.getCity();

        /*
           我方字典-贷款金额
           1.3万以下
           2.5万-10万
           3.10万-20万
           4.20万以上
           如果对方文档需要"带单位"如:3万，5万,使用apiFieldConverter.getLoanAmountUnit
           如果对方文档需要"数字形式"使用apiFieldConverter.getLoanAmountInt(),返回30000，50000
         */
        String loanAmount = ChooseEq.create(apiApplyParameter.getLoanAmount())
                .when("1", "30000")
                .when("2", "50000")
                .when("3", "100000")
                .when("4", "200000")
                .end();
        orgApply.setLoanAmount(loanAmount);

        /*
          我方字典-公积金
          1.无公积金
          2.缴纳6个月以下
          3.缴纳6个月以上
          4.有公积金
          如果对方只需要"有/无"使用:apiFieldConverter.hasProvidentFundToStr
          如果对方只需要"0/1"使用:apiFieldConverter.hasProvidentFundToNumber
        */
        String providentFund = ChooseEq.create(apiApplyParameter.getProvidentFund())
                .when("1", "无公积金")
                .when("2", "有公积金")
                .when("3", "有公积金")
                .when("4", "有公积金")
                .end();
        orgApply.setProvidentFund(providentFund);

        /*
           我方字典-车辆情况
           1.无车产
           2.有车不抵押
           3.有车可抵押
           4.有车
           如果对方文档是需要返回"0"和"1" 使用:apiFieldConverter.hasCarInfoToNumber
           如果对方文档是需要返回"有"和"无",使用:apiFieldConverter.hasCarInfoToStr
         */
        String carInfo = ChooseEq.create(apiApplyParameter.getCarInfo())
                .when("1", "无车")
                .when("2", "有车")
                .when("3", "有车")
                .when("4", "有车")
                .end();
        orgApply.setCarInfo(carInfo);

        /*
          我方字典-社保缴纳
          1.无社保
          2.缴纳6个月以下
          3.缴纳6个月以上
          4.有社保
          如果对方需要"有无社保情况"如:有/无，使用使用apiFieldConverter.hasSocialSecurityToStr
          如果对方需要"有无社保情况"如:0/1，使用使用apiFieldConverter.hasSocialSecurityToNumber
        */
        String socialSecurity = ChooseEq.create(apiApplyParameter.getSocialSecurity())
                .when("1", "无社保")
                .when("2", "有社保")
                .when("3", "有社保")
                .when("4", "有社保")
                .end();
        orgApply.setSocialSecurity(socialSecurity);

        /*
          我方字典-房产情况
          1.无房产
          2.有房不抵押
          3.有房可抵押
          4.有房产
          5.有按揭房产
          6.有全款房产
          如果对方需要"有无月收入"如:有/无，使用使用apiFieldConverter.hasRealEstateInfoToStr
          如果对方需要"有无月收入"如:0/1，使用使用apiFieldConverter.hasRealEstateInfoToNumber
        */
        String realEstateInfo = ChooseEq.create(apiApplyParameter.getRealEstateInfo())
                .when("1", "无房")
                .when("2", "有房")
                .when("3", "有房")
                .when("4", "有房")
                .when("5", "有房")
                .when("6", "有房")
                .end();
        orgApply.setRealEstateInfo(realEstateInfo);

        String bizLicenseYear = ChooseEq.create(apiApplyParameter.getBizLicenseYear())
                .when("1", "未注册")
                .when("2", "注册1年以下")
                .when("3", "注册1~5年")
                .when("4", "注册5年以上")
                .end();
        orgApply.setBizLicenseYear(bizLicenseYear);

        /*
           我方字典-芝麻分
           1.600分以下
           2.600~649分
           3.650~699分
           4.700分以上
           如果对方需要"分值形式"如:650，700,使用apiFieldConverter.getSesameCreditNumber/getSesameCreditStr
           如果对方要"文字形式"如:600分以下,600~649分,使用apiFieldConverter.getSesameCreditText
         */
        String sesameCredit = ChooseEq.create(apiApplyParameter.getSesameCredit())
                .when("1", "600分以下")
                .when("2", "600~649分")
                .when("3", "650~699分")
                .when("4", "700分以上")
                .end();
        orgApply.setSesameCredit(sesameCredit);

        /*
            我方字典-花呗额度
            1.无额度
            2.3千以下
            3.3千-1万
            4.1万-3万
            5.3万以上
            如果对方文档需要"文字类型"如:无额度,3千以下,使用使用apiFieldConverter.getHbLimitText
         */
        String hbLimit = ChooseEq.create(apiApplyParameter.getHbLimit())
                .when("1", "无额度")
                .when("2", "3千以下")
                .when("3", "3千-1万")
                .when("4", "1万-3万")
                .when("5", "3万以上")
                .end();
        orgApply.setHbLimit(hbLimit);

        /*
            我方字典-白条额度
            1.无额度
            2.3千以下
            3.3千-1万
            4.1万-3万
            5.3万以上
            如果对方文档需要"文字类型"如:无额度,3千以下,使用使用apiFieldConverter.getBtLimitText
         */
        String btLimit = ChooseEq.create(apiApplyParameter.getBtLimit())
                .when("1", "无额度")
                .when("2", "3千以下")
                .when("3", "3千-1万")
                .when("4", "1万-3万")
                .when("5", "3万以上")
                .end();
        orgApply.setBtLimit(btLimit);

        orgApply.setCustomerChannel("乐享融AX");
    }
}
